package com.mzy.linear_struct.subject;

import com.mzy.linear_struct.ArrayStack;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Stack;

/**
 * @Author: codermzy
 * @Date: 2024/03/26/20:14
 * @Description:
 */
public class 有效的括号 {
    public static boolean isValid(String s) {

        Stack<Character> stack = new Stack<>();
        // "()[]{}"
        for (Character c : s.toCharArray()) {
            // stack )

            if (c.equals('(')) {
                stack.push(')');
            } else if (c.equals('[')) {
                stack.push(']');
            } else if (c.equals('{')) {
                stack.push('}');
            } else if (stack.isEmpty() || !stack.pop().equals(c)) {
                return false;
            }
        }
        return stack.isEmpty();
    }

    public static boolean solution(String s) {
        ArrayStack<Character> stack = new ArrayStack<>(100);
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if ('(' == c) {
                stack.push(')');
            } else if ('[' == c) {
                stack.push(']');
            } else if ('{' == c) {
                stack.push('}');
            } else {
                if (stack.isEmpty() || stack.pop() != c) {
                    return false;
                }
            }
        }

        return stack.isEmpty();
    }
    //
    //
    // public static int calPoints(String[] operations) {
    //     Deque<String> deque = new LinkedList<>();
    //     for (int i = 0; i < operations.length; i++) {
    //         deque.addFirst(operations[i]);
    //     }
    //     int sumScore = 0;
    //     Deque<Integer> result = new LinkedList<>();
    //     while (!deque.isEmpty()) {
    //         String sign = deque.getLast();
    //         if ("C".equals(sign)) {
    //             sumScore -= result.removeLast();
    //         } else if ("D".equals(sign)) {
    //             int cur = result.getLast() * 2;
    //             sumScore += cur;
    //             result.addLast(cur);
    //         } else if ("+".equals(sign)) {
    //             Integer prev = result.removeLast();
    //             Integer prevDouble = result.getLast();
    //             result.addLast(prev);
    //             int cur = prev + prevDouble;
    //             sumScore += cur;
    //             result.addLast(cur);
    //         } else {
    //             String num = deque.getLast();
    //             int cur = Integer.parseInt(num);
    //             sumScore += cur;
    //             result.addLast(cur);
    //         }
    //         deque.removeLast();
    //     }
    //     return sumScore;
    // }
    //
    //
    // public static int calPointsNext(String[] operations) {
    //     Stack<Integer> stack = new Stack<>();
    //     int sumScore = 0;
    //
    //     for (String c : operations) {
    //         if ("+".equals(c)) {
    //             Integer prev = stack.pop();
    //             Integer prevDouble = stack.peek();
    //             int num = prev + prevDouble;
    //             stack.push(prev);
    //             stack.push(num);
    //             sumScore += num;
    //         } else if ("D".equals(c)) {
    //             int num = stack.peek() * 2;
    //             stack.push(num);
    //             sumScore += num;
    //         } else if ("C".equals(c)) {
    //             sumScore -= stack.pop();
    //         } else {
    //             int num = Integer.parseInt(c);
    //             stack.push(num);
    //             sumScore += num;
    //         }
    //     }
    //
    //     return sumScore;
    // }
    //
    // public static int calPointsNextNext(String[] operations) {
    //     int[] stack = new int[operations.length];
    //     int sumScore = 0;
    //     int i = 0;
    //     for (String c : operations) {
    //         if ("+".equals(c)) {
    //             int num = stack[i - 1] + stack[i - 2];
    //             sumScore += num;
    //             stack[i] = num;
    //             i++;
    //         } else if ("D".equals(c)) {
    //             int num = stack[i - 1] * 2;
    //             sumScore += num;
    //             stack[i] = num;
    //             i++;
    //         } else if ("C".equals(c)) {
    //             sumScore -= stack[i - 1];
    //             stack[i - 1] = 0;
    //             i--;
    //         } else {
    //             int num = Integer.parseInt(c);
    //             sumScore += num;
    //             stack[i] = num;
    //             i++;
    //         }
    //     }
    //
    //     return sumScore;
    // }

    public static void main(String[] args) {
        //
        // System.out.println(solution("(]"));
        //
        // String[] arr = new String[]{"5", "2", "C", "D", "+"};
        // System.out.println(calPoints(arr));
        // System.out.println(calPointsNext(arr));
        System.out.println(solution(""));

    }
}
